package dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import to.AgendaEquipamento;
import to.Docente;
import to.Equipamento;
import to.Sala;
import util.HibernateUtil;

public class AgendaDAO {

	public List<AgendaEquipamento> listaEquipamentoDisponivel(Date data) {

		List<AgendaEquipamento> listaEquipamento = new ArrayList<AgendaEquipamento>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(AgendaEquipamento.class,
					"ag");
			criteria.add(Restrictions.eq("ag.dataAgendada", data));
			criteria.add(Restrictions.like("ag.status", "%Agendado%"));
			criteria.addOrder(Order.asc("ag.horaInicial"));
			listaEquipamento = (List<AgendaEquipamento>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaEquipamento;
	}

	public List<AgendaEquipamento> listaTodosAgendamentos() {

		List<AgendaEquipamento> listaEquipamento = new ArrayList<AgendaEquipamento>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(AgendaEquipamento.class,
					"ag");
			criteria.add(Restrictions.like("ag.status", "%Agendado%"));
			criteria.addOrder(Order.asc("ag.id"));
			listaEquipamento = (List<AgendaEquipamento>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaEquipamento;
	}

	public List<AgendaEquipamento> verificaDisponibilidadeEquipamento(
			Date dataInformada, Date horaIni, Date horaFim,
			Integer codEquipamento) {

		List<AgendaEquipamento> listaEquipamento = new ArrayList<AgendaEquipamento>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(AgendaEquipamento.class,
					"ag").createAlias("ag.equipamento", "eq");
			criteria.add(Restrictions.eq("ag.dataAgendada", dataInformada));

			criteria.add(Restrictions.or(
					Restrictions.between("ag.horaInicial", horaIni, horaFim),
					Restrictions.between("ag.horaFinal", horaIni, horaFim)));

			criteria.add(Restrictions.like("ag.status", "%Agendado%"));
			criteria.add(Restrictions.eq("eq.id", codEquipamento));
			listaEquipamento = (List<AgendaEquipamento>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaEquipamento;
	}

	public List<Sala> buscaTodasSalas() {

		List<Sala> listaRetorno = new ArrayList<Sala>();
		Session session = null;

		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Sala.class, "s");
			criteria.addOrder(Order.asc("s.descricao"));
			listaRetorno = (List<Sala>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaRetorno;
	}

	public Sala buscaSalaPorCodigo(Integer idSala) {

		Sala s = new Sala();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Sala.class, "s");
			criteria.add(Restrictions.eq("s.id", idSala));
			s = (Sala) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return s;
	}

	public List<Docente> buscaDocente() {

		Session session = null;
		List<Docente> listaDocente = new ArrayList<Docente>();

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Docente.class, "doc");
			criteria.addOrder(Order.asc("doc.nome"));
			listaDocente = (List<Docente>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaDocente;
	}

	public Docente buscaDocentePorCodigo(Integer id) {

		Docente d = new Docente();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Docente.class, "d");
			criteria.add(Restrictions.eq("d.id", id));
			d = (Docente) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return d;
	}

	public Equipamento buscaEquipamentoPorCodigo(Integer equipamento) {

		Equipamento eq = new Equipamento();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Equipamento.class, "e");
			criteria.add(Restrictions.eq("e.id", equipamento));
			eq = (Equipamento) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return eq;
	}
}
